/**
 * Created by PanJiaChen on 16/11/18.
 */

/**
 * Parse the time to string
 * @param {(Object|string|number)} time
 * @param {string} cFormat
 * @returns {string | null}
 */
export function parseTime(time, cFormat) {
  if (arguments.length === 0) {
    return null;
  }
  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}';
  let date;
  if (typeof time === 'object') {
    date = time;
  } else {
    if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
      time = parseInt(time, 10);
    }
    if (typeof time === 'number' && time.toString().length === 10) {
      time = time * 1000;
    }
    date = new Date(time);
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay(),
  };
  const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
    const value = formatObj[key];
    // Note: getDay() returns 0 on Sunday
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value];
    }
    return value.toString().padStart(2, '0');
  });
  return time_str;
}

/**
 * @param {number} time
 * @param {string} option
 * @returns {string}
 */
export function formatTime(time, option) {
  if (('' + time).length === 10) {
    time = parseInt(time, 10) * 1000;
  } else {
    time = +time;
  }
  const d = new Date(time);
  const now = Date.now();

  const diff = (now - d) / 1000;

  if (diff < 30) {
    return '刚刚';
  } else if (diff < 3600) {
    // less 1 hour
    return Math.ceil(diff / 60) + '分钟前';
  } else if (diff < 3600 * 24) {
    return Math.ceil(diff / 3600) + '小时前';
  } else if (diff < 3600 * 24 * 2) {
    return '1天前';
  }
  if (option) {
    return parseTime(time, option);
  } else {
    return (
      d.getMonth() +
      1 +
      '月' +
      d.getDate() +
      '日' +
      d.getHours() +
      '时' +
      d.getMinutes() +
      '分'
    );
  }
}

/**
 * @param {string} url
 * @returns {Object}
 */
export function param2Obj(url) {
  const search = url.split('?')[1];
  if (!search) {
    return {};
  }
  return JSON.parse(
    '{"' +
    decodeURIComponent(search)
      .replace(/"/g, '\\"')
      .replace(/&/g, '","')
      .replace(/=/g, '":"')
      .replace(/\+/g, ' ') +
    '"}'
  );
}
/**
 * 时间格式转换 yyyy-MM-ddTHH:mm:ssZ
 * @param {Date} date Date类型的时间
 */
export function datetoISOString(date) {
  return date.toISOString().replace(/\.\d{3}/, '');
}

/**
 * 数据加密
 * @param {Any} data 待加密数据
 */
export function dataToBase64(data) {
  return window.btoa(data);
}

/**
 * 设置session
 * @param {string} key session key
 * @param {string} val session val
 */
export function setSession(key, val) {
  sessionStorage.setItem(key, val);
}

/**
 * 获取session
 * @param {string} key session key
 * @return {string} session[key]的值
 */
export function getSession(key) {
  return sessionStorage.getItem(key);
}

/**
 * 删除session
 * @param {string} key session key
 * @return {Boolean} 是否存在session[key]
 */
export function removeSession(key) {
  if (getSession(key)) {
    sessionStorage.removeItem('key');
    return true;
  } else {
    return false;
  }
}
/**
 * 单数数前加0处理
 * @param {Number} n 数字
 */
const formatNumber = n => {
  n = n.toString();
  return n[1] ? n : '0' + n;
};
/**
 * 日期格式化
 * @param {Date} date 日期格式
 * @return {String} yyyy-MM-DD hh:mm:ss
 */
export function formatDate(date) {
  const year = date.getFullYear();
  const month = date.getMonth() + 1;
  const day = date.getDate();
  const hour = date.getHours();
  const minute = date.getMinutes();
  const second = date.getSeconds();
  return (
    [year, month, day].map(formatNumber).join('-') +
    ' ' +
    [hour, minute, second].map(formatNumber).join(':')
  );
}
/**
 * 单位转换
 * @param {Number | String} n 待处理单位类型
 * @param {Numnber} digit 保留小数位数
 */
export function unitToExpect(n, digit = 2) {
  const listType = {
    TB: 1024 * 1024 * 1024 * 1024,
    GB: 1024 * 1024 * 1024,
    MB: 1024 * 1024,
    KB: 1024,
    Bytes: 0,
  };
  let integralPart;

  if (listType.TB <= n) {
    integralPart = (n / listType.TB).toFixed(digit) + 'TB';
  } else if (listType.GB < n && n < listType.TB) {
    integralPart = (n / listType.GB).toFixed(digit) + 'GB';
  } else if (listType.MB < n && n < listType.GB) {
    integralPart = (n / listType.MB).toFixed(digit) + 'MB';
  } else if (listType.KB < n && n < listType.MB) {
    integralPart = (n / listType.KB).toFixed(digit) + 'KB';
  } else if (n < listType.KB) {
    integralPart = n + 'Bytes';
  }
  return integralPart;
}
/**
 * 去除输入框两端空格
 * @param {String} str 待处理字符串
 */
export function trim(str) {
  return str.replace(/(^\s*)|(\s*$)/g, '');
}
